package clases;

import main.Errores;

/**
  *  4g3nt
  *  Copyright (C) 2008  Carlos Molinero y César Andrés
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *    You should have received a copy of the GNU General Public License
  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
public class BufferEntrada {
    // and a single consumer thread
	   private int numSlots = 0;
	   private Mensajes[] buffer = null;
	   private int putIn = 0, takeOut = 0;
	   private int count = 0;
	   	
	   public BufferEntrada(int numSlots) {
	      if (numSlots <= 0) {numSlots = 1;}
	      this.numSlots = numSlots;
	      buffer = new Mensajes[numSlots];
	   }

	   public synchronized void insertarMensaje(Mensajes value) {
	      while (count == numSlots)
	         try {
	            wait();
	         } catch (InterruptedException e) {
                     Errores.insertar("interrupted out of wait");
	         }
	      buffer[putIn] = value;
	      putIn = (putIn + 1) % numSlots;
	      count++;                   // wake up the consumer
	      if (count == 1) notify();  // since it might be waiting
	   }

	   public synchronized Mensajes fetch() {
		   Mensajes value;
	      while (count == 0)
	         try {
	            wait();
	         } catch (InterruptedException e) {
	             Errores.insertar("interrupted out of wait");
	         }
	      value = buffer[takeOut];
	      takeOut = (takeOut + 1) % numSlots;
	      count--;                           // wake up the producer
	      if (count == numSlots-1) notify(); // since it might be waiting
	      
	      return value;
	   }		
	   public synchronized void print()
	   {
		   
		   
	   }
}
